/**
 * 初始化 BootStrap Table 的封装
 * @author JobsZhang
 * 
 * @param bstableId	绑定的tableid
 * @param toolbarId 绑定的按钮工具栏id
 * @param url       异步加载请求地址
 * @param columns	绑定列数组
 * @param ajaxData	额外数据
 * @param dataName	请求到的数据，如果是一个对象，绑定存集合的属性
 * @param isSingleSelect	是否是单选
 * @param method	post或者get
 * @param uniqueId	唯一标识
 * @param onClickRow 点击行触发的事件
 * @param pageSize 每页显示多少条数据 num默认为10条
 * @returns
 */
(function () {
    var BSTable = function (bstableId,toolbarId, url, columns,ajaxData,dataName,isSingleSelect,method,uniqueId,pageSize) {
        this.btInstance = null;                 //jquery和BootStrapTable绑定的对象
        this.bstableId = bstableId;
        this.url = url;
        this.toolbarId = toolbarId;
        this.columns = columns;
        this.height = 500;                      //默认表格高度665
        this.pageSize = (pageSize >= 0) ? pageSize : 10;//默认每页显示10条数据
        this.queryParams = function (param) {
        	var pageNum = param.offset/param.limit+1;
        	var parms =new Object();
        	parms.pageNum=pageNum;//这里的键的名字和控制器的变量名必须一直，这边改动，控制器也需要改成一样的  
        	parms.pageSize=param.limit;  //页码               
        	parms.sortName= param.sort;  //排序列名           
        	parms.sortType= param.order;//排位命令（desc，asc）
        	for(var atr in ajaxData){
        		parms[atr]=ajaxData[atr];
        	}
            return parms; 
        }; // 向后台传递的自定义参数
        this.dataName=dataName;
        this.singleSelect=isSingleSelect;
        this.uniqueId=uniqueId;
        this.openSearch=false;
        this.onClickRow=function(){};
    };
    BSTable.prototype = {
    		
        /**
         * 初始化bootstrap table
         */
        init: function () {
            var tableId = this.bstableId;
            this.btInstance = $('#' + tableId).bootstrapTable({
                    url: this.url,              //请求地址
                    method: 'post',        //ajax方式,post还是get
                    dataType: "json",//期待返回数据类型
                    toolbar: "#" + this.toolbarId,//顶部工具条
                    buttonsAlign: "right",       //按钮对齐方式
                    toolbarAlign: "left",		 //工具栏对齐方式
                    striped: true,             	 //是否显示行间隔色
                    cache: false,                //是否使用缓存,默认为true
                    pagination: true,            //是否显示分页（*）
                    sortable: true,              //是否启用排序
                    sortOrder: "desc",           //排序方式
                    pageNumber: 1,                  //初始化加载第一页，默认第一页
                    pageSize: this.pageSize,               //每页的记录行数（*）
                    pageList:[5,10,20,30],    //可供选择的每页的行数（*）
                    queryParamsType: 'limit',   //默认值为 'limit' ,在默认情况下 传给服务端的参数为：offset,limit,sort
                    cardView: false,                    //是否显示详细视图
                    dataField: this.dataName,//服务端返回数据键值 就是说记录放的键值是rows，分页时使用总记录数的键值为total
                    uniqueId: this.uniqueId,                     //每一行的唯一标识，一般为主键列
                    queryParams:this.queryParams , // 向后台传递的自定义参数
                    sidePagination: 'server',   //分页方式：client客户端分页，server服务端分页（*）
                    search: this.openSearch,              //是否显示表格搜索，此搜索是客户端搜索，不会进服务端
                    searchOnEnterKey: false,     //设置为 true时，按回车触发搜索方法，否则自动触发搜索方法
                    strictSearch: false,         //设置为 true启用 全匹配搜索，否则为模糊搜索
                    showColumns: false,          //是否显示所有的列
                    showRefresh: false,          //是否显示刷新按钮
                    minimumCountColumns: 2,     //最少允许的列数
                    clickToSelect: false,        //是否启用点击选中行
                    columns: this.columns,      //列数组
                    paginationLoop:false,//	设置为 true 启用分页条无限循环的功能。
                    height: this.height,
                    singleSelect  : this.singleSelect,           // 单选checkbox 
                    paginationPreText:"上一页",
          	        paginationNextText:"下一页",
          	        escape:true,
                    undefinedText:"-",//当数据为 undefined 时显示的字符
                    icons: {
                        refresh: 'glyphicon-repeat',
                        toggle: 'glyphicon-list-alt',
                        columns: 'glyphicon-list'
                    },
                    iconSize: 'outline',
                    onClickRow:this.onClickRow,
                    onCheck:this.onCheck,//勾选事件
                    onUncheck:this.onUncheck,//取消勾选事件
                    onLoadSuccess:this.onLoadSuccess
                });
            return this;
        },
        /**
         * 数据加载成功后触发事件
         * @author ltjn 2017/09/07
         * @param cb 回调函数
         * @returns {BSTable}
         */
        onLoadSuccess: function (cb) {
            if(typeof cb == "function"){
                this.onLoadSuccess = cb;
            }
            return this;
        },
        /**
         * 勾选当前行触发事件
         * @author ltjn 2017/09/07
         * @param cb 回调函数
         * @returns {BSTable}
         */
        onCheck: function (cb) {
            if (typeof cb == "function") {
                this.onCheck = cb;
            }
            return this;
        },
        /**
         * 取消勾选当前行触发事件
         * @author ltjn 2017/09/07
         * @param cb 回调函数
         * @returns {BSTable}
         */
        onUncheck: function (cb) {
            if (typeof cb == "function") {
                this.onUncheck = cb;
            }
            return this;
        },
        /**
         * 向后台传递的自定义参数
         * @param param
         */
        setQueryParams: function (data) {
        	this.queryParams = function (param) {
            	var pageNum = param.offset/param.limit+1;
            	var parms =new Object();
            	parms.pageNum=pageNum;//这里的键的名字和控制器的变量名必须一直，这边改动，控制器也需要改成一样的  
            	parms.pageSize=param.limit;  //页码               
            	parms.sortName= param.sort;  //排序列名           
            	parms.sortType= param.order;//排位命令（desc，asc）
            	for(var atr in data){
            		parms[atr]=data[atr];
            	}
                return parms; 
            }; 
        },
        /**
         * 设置每页显示多少条数据
         * @param pageSize
         */
        setPageSize:function (pageSize) {
            this.pageSize = pageSize
        },
        /**
         * 设置分页方式：server 或者 client
         */
        setPaginationType: function (type) {
            this.paginationType = type;
        },
        /**
         * 设置ajax post请求时候附带的参数
         */
        set: function (key, value) {
            if (typeof key == "object") {
                for (var i in key) {
                    if (typeof i == "function")
                        continue;
                    this.data[i] = key[i];
                }
            } else {
                this.data[key] = (typeof value == "undefined") ? $("#" + key).val() : value;
            }
            return this;
        },
        /**
         * 设置是否开启客户端搜索
         */
        OpenSearch:function(data){
        	 this.openSearch=data;
        	 return this;
        },
        /**
         * 清空ajax post请求参数
         */
        clear: function () {
            this.data = {};
            return this;
        },
        /**
         * 设置行点击事件
         */
        setOnClickRow:function(data){
        	this.onClickRow=data;
        	return this;
        },
        /**
         * 刷新 bootstrap 表格
         * Refresh the remote server data,
         * you can set {silent: true} to refresh the data silently,
         * and set {url: newUrl} to change the url.
         * To supply query params specific to this request, set {query: {foo: 'bar'}}
         */
        refresh: function (parms) {
            if (typeof parms != "undefined") {
                this.btInstance.bootstrapTable('refresh', parms);
            } else {
                this.btInstance.bootstrapTable('refresh');
            }
        },
        /**
         * 获取勾选的行
         */
        getSelect:function(){
        	var obj = this.btInstance.bootstrapTable('getSelections');
        	return obj;
        },
        /**
         * 
         */
        setHeight :function(data){
        	this.height = data;
        	return this;
        },
        setColumns :function(columns){
        	 this.columns=columns;
        	 return this;
        },
        setMethod:function(parm){
        	this.method=parm;
        	return this;
        },
        getPage:function(){
        	var obj = this.btInstance.bootstrapTable("getPage");
        	return obj;
        }
    };
    window.BSTable = BSTable;
}());